#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>

#include "set.h"
#include "set_errno.h"

static int nb_test = 0;

void test_size() {
  nb_test++;

  struct set s = set__empty();

  assert(set__size(&s) == 0);

  set__add(&s, 'e');
  set__add(&s, 'o');
  set__add(&s, 'a');
  
  assert(set__size(&s) == 3);
  
  set__add(&s, 'a');
  assert(set__size(&s) == 3);

  set__add(&s, 'x');
  assert(set__size(&s) == 4);

  set__remove(&s, 'a');
  assert(set__size(&s) == 3);
}

void test_is_empty (){
	nb_test ++;
	struct set s = set__empty();
assert(set__is_empty (s) == 1);
	



void test_add() {
  nb_test++;

  struct set s = set__empty();

  assert(set__add(&s, 'x') == 0);  

  set__add(&s, 'e');
  set__add(&s, 'o');
  set__add(&s, 'a');

  assert(set__add(&s, 'x') == 1);  
  assert(set__errno == SET__ELEMENT_DUPLICATION);  

  assert(set__find(&s, 'a'));
  assert(set__find(&s, 'e'));
  assert(set__find(&s, 'o'));
}

void test_inter() {
  nb_test++;

  struct set s1  = set__empty();
  struct set s2  = set__empty();
  struct set res = set__empty();

  set__add(&s2, 'e');
  set__add(&s2, 'h');
  set__add(&s2, 'o');
  set__add(&s2, 'x');

  set__inter(&s1, &s2, &res);
  assert(set__is_empty(&res));

  set__add(&s1, 'd');
  set__add(&s1, 'h');
  set__add(&s1, 'm');
  set__add(&s1, 'o');

  set__inter(&s1, &s2, &res);
  assert(set__is_empty(&res) == false);

  assert(set__size(&res) == 2);
  assert(set__find(&res, 'o'));
  assert(set__find(&res, 'h'));
}

int main() {
  test_size();
  //test_is_empty();

  //test_find();
  test_add();
  //test_remove();

  test_inter();
  //test_union();

  printf("OK(%d)\n", nb_test);
  return EXIT_SUCCESS;
}
